/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.cidetec.utils;

import com.cidetec.modelo.entidad.Libro;
import com.cidetec.modelo.entidad.Persona;
import com.cidetec.modelo.entidad.Usuario;
import java.lang.reflect.Field;
import java.util.Comparator;
import org.primefaces.model.SortOrder;

/**
 *
 * @author Carlos
 */
public class LazySorterUsuario implements Comparator<Usuario> {

    private String sortField;

    private SortOrder sortOrder;

    public LazySorterUsuario(String sortField, SortOrder sortOrder) {
        this.sortField = sortField;
        this.sortOrder = sortOrder;
    }

    @Override
    public int compare(Usuario usuario1, Usuario usuario2) {
        try {
            Object value1;
            Object value2;
            Field field1;
            Field field2;
            String compere = sortField; 
            if (sortField.contains("persona")) {
                compere = compere.replace("persona.", "");
                Persona persona1 = usuario1.getPersona();
                Persona persona2 = usuario2.getPersona();

                field1 = persona1.getClass().getDeclaredField(compere);
                field2 = persona1.getClass().getDeclaredField(compere);
                field1.setAccessible(true);
                field2.setAccessible(true);
                value1 = field1.get(persona1);
                value2 = field2.get(persona2);
            } else {
                field1 = usuario1.getClass().getDeclaredField(sortField);
                field2 = usuario2.getClass().getDeclaredField(sortField);
                field1.setAccessible(true);
                field2.setAccessible(true);
                value1 = field1.get(usuario1);
                value2 = field2.get(usuario2);
            }

            int value = ((Comparable) value1).compareTo(value2);

            return SortOrder.ASCENDING.equals(sortOrder) ? value : -1 * value;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
}
